<?php

 /**
  * ---------------------------------------------------------------
  * APERTURA CONTROLADOR
  * ---------------------------------------------------------------
  * Esta es la clase Controlador apertura, contiene la invocación a todas las vistas 
  * para realizar las funciones ligadas a apertura
  */
 class Apertura extends CI_Controller {

     private $periodo;



     /**
      * ---------------------------------------------------------------
      * CONSTRUCTOR
      * ---------------------------------------------------------------
      * Este es el constructor, el cual incluye la libreria url que es indispensable 
      * :]
      */
     public function __construct() {
         parent::__construct();
         $this->load->helper("url");
         $this->load->library("session");

         if (!$this->estas_dentro())
             redirect(base_url());

     }




     /**
      * ---------------------------------------------------------------
      * PANTALLA
      * ---------------------------------------------------------------
      * Index pantalla...
      * 
      * @link base_url()/index.php/alumno
      * @author Sergio Morlán Páramo
      */
     public function index() {
         $this->load->library("utils/fecha");
         $data = array(
                   "titulo" => "Nueva apertura",
                   "fecha" => $this->fecha->getFecha(),
                   "menu" => "menu_jefatura",
                   "asignaturas" => $this->cargar_asignaturas(),
                   "profesores" => $this->cargar_profesores(),
                   "salas" => $this->cargar_salas(),
                   "contenido" => "jefatura/apertura/apertura_inicio"
         );
         $this->load->view("plantilla/plantilla_unam", $data);

     }




     /**
      * ---------------------------------------------------------------
      * PANTALLA E INTERCAMBIO (BUSINESS)
      * ---------------------------------------------------------------
      * Formulario de registro y validaciones ... 
      * Muestra el formularion necesario para realizar el registro de apertura
      * :]
      * @author Sergio Morlán Páramo
      * @link base_url()/index.php/apertura/agregar
      */
     public function nueva_() {
         $this->load->helper("form");
         $this->load->library("form_validation");
         $this->load->library("utils/fecha");
         $form_valido = FALSE;

         /* /* Si no se a enviado nada y el periodo tampoco se a "seteado"
           if (!$_POST AND !$this->periodo)
           $this->nueva(); */

         // Si es que se realiza un envío (presionar submit)
         if ($_POST AND !$this->periodo)
             $form_valido = $this->validaciones();

         if (!$this->periodo)
             $this->nueva();

         // Si ocurrio algun error de validación regresamos al formulario
         if (!$form_valido) {
             $data = array(
                       "titulo" => "Nueva Apertura " . $this->periodo,
                       "fecha" => $this->fecha->getFecha(),
                       "menu" => "menu_jefatura",
                       "periodo" => $this->periodo,
                       "asignaturas" => $this->cargar_asignaturas(),
                       "profesores" => $this->cargar_profesores(),
                       "salas" => $this->cargar_salas(),
                       "contenido" => "jefatura/apertura/apertura_agregar"
             );
             $this->load->view("plantilla/plantilla_unam", $data);
         } else {
             $this->intentar_agregar();
         }

     }




     public function nueva() {
         $this->load->helper("form");
         $this->load->library("form_validation");
         $this->load->library("utils/fecha");

         $periodofijo_valido = FALSE;

         if ($_POST) {
             $this->form_validation->set_rules("apertura_periodofijo", "Periodo", "callback_format_periodo|required|max_length[10]|trim|xss_clean");
             $this->form_validation->set_error_delimiters("<div class='error_form_validation'>", "</div>");
             $this->form_validation->set_message("required", "Debe introducir el campo %s");
             $periodofijo_valido = $this->form_validation->run();
             if (isset($_POST["apertura_periodofijo"]))
                 $this->periodo = $_POST["apertura_periodofijo"];
         }


         if (!$periodofijo_valido) {
             $data = array(
                       "titulo" => "Fijar Periodo",
                       "fecha" => $this->fecha->getFecha(),
                       "menu" => "menu_jefatura",
                       "contenido" => "jefatura/apertura/apertura_fijarperiodo"
             );
             $this->load->view("plantilla/plantilla_unam", $data);
         } else {
             $this->nueva_();
         }

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS)
      * ---------------------------------------------------------------
      * Validación de formulario ...
      * Vamos a realizar las validaciones necesarias del lado del servidor, la información
      * sobre estos metodos se encuentra en la documentación de codeigniter
      * 
      * @access private
      * @return boolean 
      * @author Sergio Morlán Páramo
      */
     private function validaciones() {

         // Validaciones generales
         $this->form_validation->set_rules("apertura_grupo", "grupo", "required|max_length[45]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_subgrupo", "subgrupo", "required|max_length[3]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_asignatura", "asignatura", "required|max_length[11]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_profesor", "profesor", "required|max_length[11]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_salon", "salon", "required|max_length[11]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_lunesInicio", "lunesInicio", "callback_format_hora|trim|xss_clean");
         $this->form_validation->set_rules("apertura_lunesFinal", "lunesFinal", "callback_h_match[apertura_lunesInicio]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_martesInicio", "martesInicio", "callback_format_hora|trim|xss_clean");
         $this->form_validation->set_rules("apertura_martesFinal", "martesFinal", "callback_h_match[apertura_martesInicio]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_miercolesInicio", "miercolesInicio", "callback_format_hora|trim|xss_clean");
         $this->form_validation->set_rules("apertura_miercolesFinal", "miercolesFinal", "callback_h_match[apertura_miercolesInicio]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_juevesInicio", "juevesInicio", "callback_format_hora|trim|xss_clean");
         $this->form_validation->set_rules("apertura_juevesFinal", "juevesFinal", "callback_h_match[apertura_juevesInicio]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_viernesInicio", "viernesInicio", "callback_format_hora|trim|xss_clean");
         $this->form_validation->set_rules("apertura_viernesFinal", "viernesFinal", "callback_h_match[apertura_viernesInicio]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_sabadoInicio", "sabadoInicio", "callback_format_hora|trim|xss_clean");
         $this->form_validation->set_rules("apertura_sabadoFinal", "sabadoFinal", "callback_h_match[apertura_sabadoInicio]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_domingoInicio", "domingoInicio", "callback_format_hora|trim|xss_clean");
         $this->form_validation->set_rules("apertura_domingoFinal", "domingoFinal", "callback_h_match[apertura_domingoInicio]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_cupo", "cupo", "required|max_length[11]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_periodo", "periodo", "required|max_length[10]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_fechaInicio", "fechaInicio", "required|max_length[10]|trim|xss_clean");
         $this->form_validation->set_rules("apertura_fechaFin", "fechaFin", "required|max_length[10]|trim|xss_clean");

         // Formato de wrapper para los mensajes de error
         $this->form_validation->set_error_delimiters("<div class='error_form_validation'>", "</div>");

         // Personalización de mensajes
         $this->form_validation->set_message("required", "Debe introducir el campo %s");
         $this->form_validation->set_message("alpha", "El campo %s no admite caracteres numericos");
         $this->form_validation->set_message("min_length", "El campo %s debe ser de por lo menos %s caracteres");
         $this->form_validation->set_message("exact_length", "El campo %s debe tener exactamente %s caracteres");
         $this->form_validation->set_message("valid_email", "Debe escribir un formato de correo v&aacute;lido");
         $this->form_validation->set_message("numeric", "Debe introducir solo numeros en el campo %s");
         $this->form_validation->set_message("integer", "Debe introducir solo numeros en el campo %s");
         $this->form_validation->set_message("matches", "Los emails no son iguales");

         if (isset($_POST["apertura_periodo"]))
             $this->periodo = $_POST["apertura_periodo"];

         // Retorno el resultado de la validación
         return $this->form_validation->run();

     }




     public function format_periodo($str) {
         $this->form_validation->set_message('format_periodo', 'Formato (aaaa-I) o (aaaa-II)');
         return (!preg_match("/([0-9]{4})+(-)+([I]{1,2})$/", $str)) ? FALSE : TRUE;

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS) Form_validation Callback
      * ---------------------------------------------------------------
      * Vamos a validar que el formato de hora sea correcto :]
      * 
      * @param String $str Valor del campo
      * @return boolean
      * @author Sergio Morlán Páramo
      */
     public function format_hora($str) {
         if (!$_POST)
             redirect(site_url("jefatura"));

         if ($str == "")
             return TRUE;

         $this->form_validation->set_message('format_hora', 'Formato (hh:mm)');

         if (!preg_match("/([0-9]{2})+(:)+([0-9]{2})$/", $str)) {
             return FALSE;
         } else {
             $hh = substr($str, 0, 2);
             $mm = substr($str, 3);
             return ($hh > 23 || $mm > 59) ? FALSE : TRUE;
         }

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS) Form_validation Callback
      * ---------------------------------------------------------------
      * Vamos a validar que la hora de termino no sea menor a la hora de inicio :]
      * 
      * @param String $str Valor del campo
      * @param String $s Nombre del Campo a comparar (xx_inicio)
      * @return boolean
      * @author Sergio Morlán Páramo
      */
     public function h_match($str=FALSE, $s=FALSE) {
         if (!$_POST)
             redirect(site_url("jefatura"));

         $val_campo = set_value($s);

         if (!$this->format_hora($str)) {
             $this->form_validation->set_message('h_match', 'Formato (hh:mm)');
             return FALSE;
         }


         if (!$this->format_hora($val_campo))
             return TRUE;



         if ($val_campo != "" AND $str == "") {
             $this->form_validation->set_message('h_match', 'Hora de Termino necesaria');
             return FALSE;
         }


         if ($val_campo == "" AND $str != "") {
             $this->form_validation->set_message('h_match', 'Hora de Inicio necesaria');
             return FALSE;
         }


         if ($str != "")
             if ($str <= $val_campo) {
                 $this->form_validation->set_message('h_match', 'El Termino debe ser mayor');
                 return FALSE;
             } else {
                 return TRUE;
             }

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS)
      * ---------------------------------------------------------------
      * Vamos a intentar registrar apertura, tendremos que hacer ciertas validaciones en 
      * Si todos los formatos son correctos se eviarán atributos llamando al modelo_alumno 
      * 
      * @access private
      * @author Sergio Morlán Páramo
      */
     private function intentar_agregar() {
         // Si no existe ningún envio por POST redireccionamos
         if (!$_POST)
             redirect(site_url("apertura/agregar"));

         // Carga dek nideki
         $this->load->library("api/apertura_class");

         // Asignado los atributos de apertura
         $this->apertura_class->set_id($this->apertura_class->get_siguienteID());
         $this->asignar_atributos();

         // Se intenta registrar
         if ($this->apertura_class->xnew()) {
             redirect(site_url("jefatura"));
         } else {
             // En caso de un error OJO muestra mensaje error de MySQL
             show_error("No se pudo agregar nueva asignatura", 500, "4");
         }

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS) API
      * ---------------------------------------------------------------
      * Vamos a asignar todos excepto matricula (PK) los atributos del objeto apertura
      * 
      * @access private
      * @author Sergio Morlán Páramo
      */
     private function asignar_atributos() {
         $this->apertura_class->set_grupo($_POST["apertura_grupo"]);
         $this->apertura_class->set_subgrupo($_POST["apertura_subgrupo"]);
         $this->apertura_class->set_asignatura($_POST["apertura_asignatura"]);
         $this->apertura_class->set_profesor($_POST["apertura_profesor"]);
         $this->apertura_class->set_salon($_POST["apertura_salon"]);
         $this->apertura_class->set_lunesInicio($_POST["apertura_lunesInicio"]);
         $this->apertura_class->set_lunesFinal($_POST["apertura_lunesFinal"]);
         $this->apertura_class->set_martesInicio($_POST["apertura_martesInicio"]);
         $this->apertura_class->set_martesFinal($_POST["apertura_martesFinal"]);
         $this->apertura_class->set_miercolesInicio($_POST["apertura_miercolesInicio"]);
         $this->apertura_class->set_miercolesFinal($_POST["apertura_miercolesFinal"]);
         $this->apertura_class->set_juevesInicio($_POST["apertura_juevesInicio"]);
         $this->apertura_class->set_juevesFinal($_POST["apertura_juevesFinal"]);
         $this->apertura_class->set_viernesInicio($_POST["apertura_viernesInicio"]);
         $this->apertura_class->set_viernesFinal($_POST["apertura_viernesFinal"]);
         $this->apertura_class->set_sabadoInicio($_POST["apertura_sabadoInicio"]);
         $this->apertura_class->set_sabadoFinal($_POST["apertura_sabadoFinal"]);
         $this->apertura_class->set_domingoFinal($_POST["apertura_domingoFinal"]);
         $this->apertura_class->set_domingoInicio($_POST["apertura_domingoInicio"]);
         $this->apertura_class->set_cupo($_POST["apertura_cupo"]);
         $this->apertura_class->set_periodo($_POST["apertura_periodo"]);
         $this->apertura_class->set_fechaInicio($_POST["apertura_fechaInicio"]);
         $this->apertura_class->set_fechaFin($_POST["apertura_fechaFin"]);
         $this->apertura_class->set_status($_POST["apertura_status"]);

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS)
      * ---------------------------------------------------------------
      * Vamos a verificar que el usuario realmente haya iniciado sesión ;]
      * 
      * @access private
      * @return boolean
      * @author Sergio Morlán Páramo
      */
     private function estas_dentro() {
         if ($this->session->userdata("J_SESION"))
             return TRUE;

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS)
      * ---------------------------------------------------------------
      * Vamos a obtener todas las asignaturas ;]
      * 
      * @access private
      * @return Array Objeto asignatura_class
      * @author Sergio Morlán Páramo
      */
     private function cargar_asignaturas() {
         $this->load->library("api/asignatura_class");
         return $this->asignatura_class->xgets(array("nombre"), FALSE, "nombre");

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS)
      * ---------------------------------------------------------------
      * Vamos a obtener todos los profesores ;]
      * 
      * @access private
      * @return Array Objeto profesor_class
      * @author Sergio Morlán Páramo
      */
     private function cargar_profesores() {
         $this->load->library("api/profesor_class");
         return $this->profesor_class->xgets(array("nombre"), FALSE, "nombre");

     }




     /**
      * ---------------------------------------------------------------
      * INTERCAMBIO (BUSINESS)
      * ---------------------------------------------------------------
      * Vamos a obtener todos las salas ;]
      * 
      * @access private
      * @return Array Objeto sala_class
      * @author Sergio Morlán Páramo
      */
     private function cargar_salas() {
         $this->load->library("api/sala_class");
         return $this->sala_class->xgets(array("numero"), FALSE, "edificio");

     }




     public function prueba() {
         $this->load->library("api/apertura_class");
         $apertura = new Apertura_class("1", array("cupo"));
         if ($apertura->id())
             echo $apertura->grupo(), "- CUPO:" . $apertura->cupo();
         $apertura->setid($apertura->nextID());
         $apertura->xnew();
         echo $apertura->q_strquery();

     }




 }

 